Previous

1.1 解压序列赋值给多个变量

问题

现在有一个包含 N 个元素的元组或者是序列,怎样将它里面的值解压后同时赋值给 N 个变量?

解决方案

任何的序列(或者是可迭代对象)可以通过一个简单的赋值语句解压并赋值给多个变量。 唯一的前提就是变量的数量必须跟序列元素的数量是一样的。

代码示例:


In [1]:
p = (4, 5)
x, y = p

In [2]:
x


Out[2]:
4

In [3]:
y


Out[3]:
5

In [4]:
data = ["ACME", 50, 91.1, (2012, 12, 21)]
name, shares, price, date = data

In [5]:
name


Out[5]:
'ACME'

In [6]:
date


Out[6]:
(2012, 12, 21)

In [7]:
name, shares, price, (year, mon, day) = data

In [8]:
name


Out[8]:
'ACME'

In [9]:
year


Out[9]:
2012

In [10]:
mon


Out[10]:
12

In [11]:
day


Out[11]:
21

如果变量个数和序列元素的个数不匹配,会产生一个异常。

代码示例:


In [12]:
p = (4, 5)
x, y, z = p


---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-12-c6231ccc0a30> in <module>()
      1 p = (4, 5)
----> 2 x, y, z = p

ValueError: not enough values to unpack (expected 3, got 2)

讨论

实际上,这种解压赋值可以用在任何可迭代对象上面,而不仅仅是列表或者元组。 包括字符串,文件对象,迭代器和生成器。

代码示例:


In [13]:
s = "Hello"
a, b, c, d, e = s

In [14]:
a


Out[14]:
'H'

In [15]:
b


Out[15]:
'e'

In [16]:
e


Out[16]:
'o'

有时候,你可能只想解压一部分,丢弃其他的值。对于这种情况 Python 并没有提供特殊的语法。 但是你可以使用任意变量名去占位,到时候丢掉这些变量就行了。

代码示例:


In [17]:
data = ["ACME", 50, 91.1, (2012, 12, 21)]
_, shares, price, _ = data

In [18]:
shares


Out[18]:
50

In [19]:
price


Out[19]:
91.1

你必须保证你选用的那些占位变量名在其他地方没被使用到。

Next